# -*- coding: utf-8 -*-
import pdb
from django.template.loader import get_template
from django.shortcuts import render_to_response
from django.http import HttpResponse,HttpResponseRedirect
from django.template.context import RequestContext
from django.contrib.auth.decorators import login_required
from kdb.models import *
from django.contrib.auth import authenticate, login, logout
from django.contrib import auth
from django.core.mail import send_mail
from asociacion.settings import STATIC_ROOT
from django.core.files.base import ContentFile
import random
import string
from asociacion.settings import appdir

def login(request):
    user = auth.authenticate(username=request.POST['username'].split('@')[0], password=request.POST['password'])
    error = False
    if user is not None and user.is_active:
        auth.login(request, user)
        return index(request)
    else:
        msgs = u"Correo Electrónico o Contraseña erróneos."
        error = True
        return index(request, msgs, error)


def logout(request):
    auth.logout(request)
    return index(request)


def solicitar_registro(request):
    clasificadores = Clasificador.objects.all()
    if request.method == "GET":
        return render_to_response("solicitar_registro.html", locals(), RequestContext(request))
    else:
        error = False
        nombre = request.POST["nombre"]
        email = request.POST["email"]
        password = request.POST["password"] #Comprobar que sean más de 6 caracteres
        password2 = request.POST["password2"]
        msgs = ""
        if password != password2:
            msgs = u"Las contraseñas no coinciden."
            return render_to_response("solicitar_registro.html", locals(), RequestContext(request))
        elif len(password) < 4 :
            msgs = u"Introduzca una contraseña de 4 o más caracteres por favor."
            return render_to_response("solicitar_registro.html", locals(), RequestContext(request))
        if (email.split('.')[-1] == 'es') and (email.split('.')[-2] == 'ugr' or email.split('@')[-1].split('.')[-2] == 'ugr'):
            if User.objects.filter(username=email).exists() or SolicitudAcceso.objects.filter(email=email).exists():
                msgs = u"Correo Electrónico Universitario ya usado."
                error = True
                return render_to_response("solicitar_registro.html", locals(), RequestContext(request))
            elif (nombre != "") and (User.objects.filter(first_name=nombre).exists() or SolicitudAcceso.objects.filter(nombre=nombre)):
                msgs = u"El nombre de usuario usado ya está en uso."
                error = True
                return render_to_response("solicitar_registro.html", locals(), RequestContext(request))
            else:
                msgs = u"Será enviado un correo electrónico para confirmar el registro. Gracias."
                token = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(16))
                if nombre == "":
                    solicitud_acceso = SolicitudAcceso(email=email, password=password, token=token)

                else:
                    solicitud_acceso = SolicitudAcceso(email=email, nombre=nombre, password=password, token=token)
                    
                # Reemplazamos los puntos y arrobas, no son válidos en las urls. Podemos reemplazarlos por cualquier otro código.
                email_parseado = email.replace("@", "rxyrxyrxy")
                email_parseado = email_parseado.replace(".", "qwxqwxqwx")
                link = u"http://workespeis-projects.com/kdb/confirmar_registro/"+email_parseado+u"/"+token+u"/"+"\""
                lista_email = []
                lista_email.append(email)
                asunto = u"Confirmación de Registro en la BD Libre Workespeis"
                mensaje = u"Ha solicitado formar parte de la comunidad Base de Datos de Conocimiento Libre de Workespeis.\n" + u"Compruebe que los siguientes datos son correctos:\nNombre a usar en la plataforma:"+nombre+"\n"+ u"Pinche el siguiente link para formalizar su acceso a la plataforma:\n"+ link +u"\n Un saludo del Equipo Workespeis."
                send_mail(asunto,mensaje,'no-responder@workespeis-projects.com',lista_email,fail_silently=False)
                solicitud_acceso.save()
                print link
                return index(request, msgs)
        else:
            msgs = u"El Correo Electrónico Universitario debe tener el dominio 'ugr.es'"
            error = True
            return render_to_response("solicitar_registro.html", locals(), RequestContext(request))


def confirmar_registro(request, email, token):
    error = False
    email = email.replace("rxyrxyrxy", "@")
    email = email.replace("qwxqwxqwx", ".")
    usuario = email.split('@')[0]
    solicitud = SolicitudAcceso.objects.get(email=email)
    password = solicitud.password
    if solicitud.token == token:
        usuario = User.objects.create_user(username=usuario,email=email, password=password)
        solicitud = SolicitudAcceso.objects.get(email=email)
        solicitud.delete()
        if solicitud.nombre != None:
            usuario.first_name = solicitud.nombre
            usuario.save()
        msg = "El registro ha finalizado con éxito."
        user = authenticate(username=usuario, password=password)
        if user is not None and user.is_active:
            auth.login(request, user)
    else:
        msg="No se ha podido completar el registro."
        error = True
    return index(request, msg, error)


def contrasenia_olvidada(request):
    if request.method == "GET":
        clasificadores = Clasificador.objects.all()
        return render_to_response("contrasenia_olvidada.html", locals(), RequestContext(request))
    else:
        email = request.POST["email"]
        usuario = email.split('@')[0]
        user = User.objects.filter(username=usuario)
        if user.exists():
            password = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8))
            user = user[0]
            user.set_password(password)
            user.save()
            lista_email = []
            lista_email.append(email)
            asunto = u'Nueva contraseña para'+user.username+u'en BD Libre'
            mensaje = u'Tras su solicitud de nueva contraseña, hemos generado una nueva contraseña aleatoria para '+user.username+u'. Nueva Contraseña: '+ password
            send_mail(asunto, mensaje, 'no-responder@workespeis-projects.com', lista_email, fail_silently=False)
            msg = u"Le ha sido enviado un correo electrónico que incluye una nueva contraseña"
            return index(request, msg)
        else:
            msg = u"No hay ningún correo electrónico asociado."
            error = True
            return index(request, msg, error)


def index(request, msgs=None, error=False):
    clasificadores = Clasificador.objects.all()
    novedades = Documento.objects.order_by("-creado")[:8]
    return render_to_response("index.html", locals(), RequestContext(request))


#NO LO USAMOS, MOSTRAMOS LOS CLASIFICADORES DIRECTAMENTE Y SIEMPRE EN EL MENÚ DE LA IZQUIERDA.
def ver_clasificadores(request):
    clasificadores = Clasificador.objects.all()

    for c in clasificadores:
        temas = Tema.objects.filter(clasificador = c)
        c.n_temas = temas.count()
        c.n_docs = 0
        for t in temas:
            c.n_docs += Documento.objects.filter(tema=t).count()
    return render_to_response("clasificadores.html", locals(),RequestContext(request))


def ver_temas(request,id):
    clasificadores = Clasificador.objects.all()
    clasificador = Clasificador.objects.get(id=id)
    temas = Tema.objects.filter(clasificador=clasificador)
    return render_to_response("temas.html",locals(),RequestContext(request))


def ver_documentos(request, id, msgs=None):
    clasificadores = Clasificador.objects.all()
    tema = Tema.objects.get(id=id)
    documentos = Documento.objects.filter(tema__id=tema.id).order_by('-creado')
    return render_to_response("documentos.html",locals(),RequestContext(request))


def ver_documento(request, id, msgs=None, error=False, comentario=None):
    clasificadores = Clasificador.objects.all()
    documento = Documento.objects.get(id=id)
    comentarios = Comentario.objects.filter(documento=documento)
    aviso = False
    if request.user.is_authenticated():
        aviso = Aviso.objects.filter(creador=request.user, documento=documento).exists()
    return render_to_response("detalle_documento.html", locals(), RequestContext(request))


def nuevo_documento(request,id):
    if request.user.is_authenticated():
        tema = Tema.objects.get(id=id)
        if request.method == 'GET':
            clasificadores = Clasificador.objects.all()
            return render_to_response("nuevo_documento.html",locals(),RequestContext(request))
        else:
	    error = []
            if request.POST["nombre"] == "":
                error.append("El nombre no puede estar en blanco")
            if not "file" in request.FILES:
                error.append("Debe enviar un fichero para crear un nuevo documento")

            if error:
                return render_to_response("nuevo_documento.html",locals(),RequestContext(request))
    
            nombre = request.POST['nombre']
            descripcion = request.POST["descripcion"][:4095]
            doc = Documento(nombre=nombre,descripcion=descripcion)
            doc.creador = request.user
            doc.tema = Tema.objects.get(id=id)
            archivo = request.FILES["file"]
            if len(archivo.name)+len(appdir) > 245:
                error.append("El nombre del fichero es demasiado largo. Intente ponerle un nombre más corto y vuelva a enviarlo.")
                return render_to_response("nuevo_documento.html",locals(),RequestContext(request))
            doc.save()
            doc.fichero.save(unicode(doc.id)+'_'+archivo.name,ContentFile(archivo.read()))
            doc.save()
            return ver_documento(request, doc.id)
    else:
        msg = "Necesita loguearse para añadir documentos al sistema. Si no tiene cuenta regístrese por favor."
        return ver_documentos(request, id, msg)


def nuevo_comentario(request,id):
    if request.user.is_authenticated():
        documento = Documento.objects.get(id=id)
        comentario = Comentario(documento=documento)
        comentario.texto = request.POST["texto"][:4095]
        comentario.user = request.user
        comentario.save()
        return ver_documento(request, documento.id)
    else:
        error = True
        msg = "Necesita loguearse para hacer comentarios. Si no tiene cuenta regístrese por favor."
        return ver_documento(request, id, msg, error, request.POST["texto"])
         

def nuevo_tema(request,id):
    if request.user.is_authenticated():
        clasificador = Clasificador.objects.get(id=id)
        if request.method == "GET":
            clasificadores = Clasificador.objects.all()
            return render_to_response("nuevo_tema.html",locals(),RequestContext(request))
        else:
            tema = Tema(nombre=request.POST['nombre'])
            tema.descripcion = request.POST['descripcion'][:4095]
            tema.creador = request.user
            tema.clasificador = clasificador
            tema.save()
            return ver_temas(request, clasificador.id)
    else:
        error = True
        msg = "Necesita loguearse para añadir nuevos temas. Si no tiene cuenta regístrese por favor."
        return index(request, msg, error)


def masuno(request,id):
    if request.user.is_authenticated():
        documento = Documento.objects.get(id=id)
        if not documento.masuno.filter(id=id).exists():
            documento.masuno.add(request.user)
        return ver_documento(request, id)
    else:
        error = True
        msg = "Necesita loguearse para dar votos positivos. Si no tiene cuenta regístrese por favor."
        return ver_documento(request, id, msg, error)        


def aviso_moderador(request, id):
    if request.user.is_authenticated():
        documento = Documento.objects.get(id=id)
        Aviso(creador=request.user, documento=documento).save()
        return ver_documento(request, id)
    else:
        error = True
        msg = "Necesita loguearse para hacer avisos a moderación. Si no tiene cuenta regístrese por favor."
        return ver_documento(request, id, msg, error)


def descargar_documento(request, id):
    documento = Documento.objects.get(id=id)
    filename = documento.fichero.name.split('/')[-1]
    response = HttpResponse(documento.fichero, content_type='text/plain')
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    return response
